package polymorphic;

//多态的基本使用
/*
    多态的前提
        1.有继承关系
        2.子类重写父类方法
        3.父类引用指向子类对象
 */
public class PolymorphicDemo1 {
    public static void main(String[] args) {
        // 父类引用指向子类对象
        Person s = new Student("sss", 10);
        Person person = new Person("jackeylove", 25);
        Student student = new Student("jack", 18);
        Teacher teacher = new Teacher("tom", 20);
        Admin admin = new Admin("mary", 25);

        // 编译类型看左边
        // 编译时，编译器认为 s 是 Person 类型，只能调用 Person 类中声明的方法
        // 若 Person 类中有 getInfo 方法，编译通过
        System.out.println(s.getInfo());
        // 运行时，实际执行的是 Student 类中的 getInfo 方法
        // 编译类型是Person，运行类型是Student，student可以调用子类中声明的方法和属性，getInfo()子类没有，调用父类的
        register(s);//Student show() name=sss age=10
        register(person);
        register(student);
        register(teacher);
        register(admin);

    }
    //接收一个Person类型的对象，可以接受所以的子类对象，调用show方法
    public static void register(Person person) {
        person.show();
    }
}

